//
//  main.cpp
//  多线程安全练习
//
//  Created by 卜绎皓 on 2023/2/6.
//

// #include <stdio.h>
// #include <pthread.h>
// #include <unistd.h>

// int count = 0;
// void* Routine(void* arg)
// {
//     while (1){
//         count++;
//         sleep(1);
//     }
//     pthread_exit((void*)0);
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, NULL, Routine, NULL);
//     while (1){
//         printf("count: %d\n", count);
//         sleep(1);
//     }
//     pthread_join(tid, NULL);
//     return 0;
// }
// #include <stdio.h>
// #include <unistd.h>
// #include <pthread.h>

// int tickets = 1000;
// void* TicketGrabbing(void* arg)
// {
//     const char* name = (char*)arg;
//     while (1){
//         if (tickets > 0){
//             usleep(10000);
//             printf("[%s] get a ticket, left: %d\n", name, --tickets);
//         }
//         else{
//             break;
//         }
//     }
//     printf("%s quit!\n", name);
//     pthread_exit((void*)0);
// }
// int main()
// {
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, NULL, TicketGrabbing, "thread 1");
//     pthread_create(&t2, NULL, TicketGrabbing, "thread 2");
//     pthread_create(&t3, NULL, TicketGrabbing, "thread 3");
//     pthread_create(&t4, NULL, TicketGrabbing, "thread 4");
    
//     pthread_join(t1, NULL);
//     pthread_join(t2, NULL);
//     pthread_join(t3, NULL);
//     pthread_join(t4, NULL);
//     return 0;
// }
// #include <stdio.h>
// #include <unistd.h>
// #include <pthread.h>

// int tickets = 1000;
// pthread_mutex_t mutex;
// void* TicketGrabbing(void* arg)
// {
//     const char* name = (char*)arg;
//     while (1){
//         pthread_mutex_lock(&mutex);
//         if (tickets > 0){
//             usleep(100);
//             printf("[%s] get a ticket, left: %d\n", name, --tickets);
//             pthread_mutex_unlock(&mutex);
//         }
//         else{
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//     }
//     printf("%s quit!\n", name);
//     pthread_exit((void*)0);
// }
// int main()
// {
//     pthread_mutex_init(&mutex, NULL);
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, NULL, TicketGrabbing, "thread 1");
//     pthread_create(&t2, NULL, TicketGrabbing, "thread 2");
//     pthread_create(&t3, NULL, TicketGrabbing, "thread 3");
//     pthread_create(&t4, NULL, TicketGrabbing, "thread 4");

//     pthread_join(t1, NULL);
//     pthread_join(t2, NULL);
//     pthread_join(t3, NULL);
//     pthread_join(t4, NULL);
//     pthread_mutex_destroy(&mutex);
//     return 0;
// }
// #include <stdio.h>
// #include <pthread.h>

// pthread_mutex_t mutex;
// void* Routine(void* arg)
// {
//     pthread_mutex_lock(&mutex);
//     pthread_mutex_lock(&mutex);
    
//     pthread_exit((void*)0);
// }
// int main()
// {
//     pthread_t tid;
//     pthread_mutex_init(&mutex, NULL);
//     pthread_create(&tid, NULL, Routine, NULL);
    
//     pthread_join(tid, NULL);
//     pthread_mutex_destroy(&mutex);
//     return 0;
// }
#include <iostream>
#include <cstdio>
#include <pthread.h>

pthread_mutex_t mutex;
pthread_cond_t cond;
void* Routine(void* arg)
{
    pthread_detach(pthread_self());
    std::cout << (char*)arg << " run..." << std::endl;
    while (true){
        pthread_cond_wait(&cond, &mutex); //阻塞在这里，直到被唤醒
        std::cout << (char*)arg << "活动..." << std::endl;
    }
}
int main()
{
    pthread_t t1, t2, t3;
    pthread_mutex_init(&mutex, nullptr);
    pthread_cond_init(&cond, nullptr);
    
    pthread_create(&t1, nullptr, Routine, (void*)"thread 1");
    pthread_create(&t2, nullptr, Routine, (void*)"thread 2");
    pthread_create(&t3, nullptr, Routine, (void*)"thread 3");
    
    while (true){
        getchar();
        pthread_cond_signal(&cond);
    }

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);
    return 0;
}

